/**
 * @description call()方法调用一个函数，其具有一个指定的this值和分别地提供的参数
 * */

Function.prototype.myCall = function (context, ...arguments) {
  if (typeof this !== 'function') {
    throw new TypeError('调用此方法的必须是函数！')
  }
  context = context || window

  let fn = Symbol(); //Symbol是唯一值，每个symbol都不相等。这样子以他作为对象的属性，可以防止替换掉原有的属性
  context[fn] = this; //this在函数中调用的时候，会指向离他最近的对象，而函数也是对象。

  let resut = context[fn](...arguments)
  delete context[fn] //删除掉我们为了改变this指向而加上的属性

  return resut
}
let a = 1,
  b = 2;

function add(c, d) {
  console.log('a', this.a)
  console.log('b', this.b)
  console.log('c', c)
  console.log('d', d)
  return this.a + this.b + c + d
}

const exmple= {
  a: 2,
  b: 3
}

console.log(add.myCall(exmple, 4, 5))
console.log(add.myCall(null, 4, 5))